package graficar;

import java.awt.*;
import java.awt.geom.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Vector;

import logicaDelNegocio.Conmutador;
import logicaDelNegocio.ConmutadorCentral;
import logicaDelNegocio.Enlace;
import logicaDelNegocio.RedDeComunicacion;

public class Diagrama extends Canvas {

	
	
	/**
	 * Constructor que recibe como parametro la red
	 * @param red
	 */
	
	private static final long serialVersionUID = 1L;
	
		
	public Diagrama (RedDeComunicacion red){
		// se llama el metodo para inicializar los componentes graficos
		this.setLists(red);
		this.setCaminos(red);
	}
	
	
	
	
	//ArrayList<GraficoTelefonoExterno> te = new ArrayList<GraficoTelefonoExterno>();
	ArrayList<GraficoConmutadorInterno> listCi = new ArrayList<GraficoConmutadorInterno>();
	GraficoConmutadorCentral cc = new GraficoConmutadorCentral();
	GraficoConmutadorInterno ci = new GraficoConmutadorInterno();
	ArrayList<Path> pathList = new ArrayList<Path>();
	ArrayList<Vector<GraficoConmutadores>> caminos = new ArrayList<Vector<GraficoConmutadores>>();
	GraficoTelefonoExterno te = new GraficoTelefonoExterno();
	ArrayList<GraficoElipse> listEliTi = new ArrayList<GraficoElipse>();
	GraficoTerminalInterna ti = new GraficoTerminalInterna();

	/**
	 *  Metodo que recibe la red, obtiene los componentes y crea
	 *  las instancias de los componentes Graficos
	 * @param redAux
	 */
	
//	private void printCaminos(){
//		for(int i=0; i<caminos.size();i++){
//			System.out.println("------>"+caminos.get(i).firstElement().id+"-"+caminos.get(i).lastElement().id+"<------");
//		}
//	}
	
	
	private void setLists (RedDeComunicacion redAux){
		
		List<Conmutador> conmutadores;
		conmutadores = redAux.getConmutadores();
		
		
		for(int i=0; i<conmutadores.size();i++){
			
			
			
			if(!(conmutadores.get(i) instanceof ConmutadorCentral)){
				
				this.listCi.add(new GraficoConmutadorInterno(conmutadores.get(i).getIdConmutador()));
				
				if(!conmutadores.get(i).getListaDeTerminales().isEmpty()){
					ArrayList<GraficoTerminalInterna> auxTi = new ArrayList<GraficoTerminalInterna>();
					
					for(int j=0; j<conmutadores.get(i).getListaDeTerminales().size(); j++){
						auxTi.add(new GraficoTerminalInterna(conmutadores.get(i).getListaDeTerminales().get(j).getIdTerminal()));
					}
					
					this.listCi.get(i-1).setTi(auxTi);
					}
			}
			else{
				cc.setId(conmutadores.get(i).getIdConmutador());
				if(conmutadores.get(i).getListaDeTerminales()!=null){
					ArrayList<GraficoTelefonoExterno> auxTe = new ArrayList<GraficoTelefonoExterno>();
					
					for(int j=0; j<conmutadores.get(i).getListaDeTerminales().size();j++){
						auxTe.add(new GraficoTelefonoExterno(conmutadores.get(i).getListaDeTerminales().get(j).getIdTerminal()));
					}
					
					this.cc.setTe(auxTe);
				}
			}
							
		}
		
		
		
	}
	
	private void setCaminos(RedDeComunicacion red){
		List<Enlace> enlaces = red.getEnlaces();
		
		for(int i=0;i<enlaces.size();i++){
			int j=-1;
			Vector<GraficoConmutadores> auxVec = new Vector<GraficoConmutadores>();
			
			do {
				if(j<(listCi.size()-1)){
				j+=1;
				}
				if(enlaces.get(i).getIdConmutadorOrigen().equals(listCi.get(j).id)){
					auxVec.add(listCi.get(j));
				}
				else if(enlaces.get(i).getIdConmutadorOrigen().equals(cc.id)){
					auxVec.add(cc);
				}
				
			} while ((!(enlaces.get(i).getIdConmutadorOrigen().equals(listCi.get(j).id)) && j<(listCi.size())-1));
			int k=-1;
			do {if(k<(listCi.size()-1)){
				k+=1;
				}
				if(enlaces.get(i).getIdConmutadorDestino().equals(listCi.get(k).id)){
					auxVec.add(listCi.get(k));
					caminos.add(i, auxVec);
					}
				else{
					if(enlaces.get(i).getIdConmutadorDestino().equals(cc.id)){
						auxVec.add(cc);
						caminos.add(i, auxVec);
					}
				}
			} while (!(enlaces.get(i).getIdConmutadorDestino().equals(listCi.get(k).id)) && k<(listCi.size()-1));
		}
				
	}
	
	public void paint(Graphics g){
		
		int ancho = getWidth();
	    int alto = getHeight();
		
	    Graphics2D g2d = (Graphics2D) g;
		GraficoElipse ge = new GraficoElipse();
		
	    
	    
	    Path cam = new Path();
	    Path cam2 = new Path();
	    Path cam3 = new Path();
	    BasicStroke standar = (BasicStroke) g2d.getStroke();
	    float dash[]={(float) (0.00002*(ancho*alto))};
	    
	    setBackground(Color.WHITE);
	    ge.setElipse(this);
	    ge.paint(g, this);
	    cc.setConCent(this, ge.getEliAux());
	    ci.setConInt(this, ge.getEliAux(),listCi, cc);
	    
	    cam2.setTerEx(cc);
	    cam2.paintEx(g,this);
	    te.paint(g, cc.getTe(), this);
	    
	    cam.setCon(caminos);
	    cam.paint(g);
	    cc.paint(g);
	    ci.paint(g, listCi);
	    te.setTelExt(this, ge.getEliAux(), cc);
	    
	    listEliTi = new GraficoElipse().setElipseTer(ge.getEliAux(), cc, listCi, this);
	    g2d.setStroke(new BasicStroke(1.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER, 5f, dash, 0.0f));
	    new GraficoElipse().paint(g, listEliTi);
	    
	    cam3.setTerIn(listEliTi, listCi);
	    cam3.paintTi(g, this);
	    
	    ti.setTi(listCi, listEliTi, this);
	    g2d.setColor(Color.BLUE);
	    ti.paint(g, listCi);
	}
	
}
